`timescale    1ps/1ps

module crc32_d8_01(
    input  wire        sclk,
    
    input  wire        crc_en,
    input  wire        data_en,
    input  wire        invert_en,
    input  wire [7:0]  din,

    output reg  [31:0] crc32_value,
   
    output wire [7:0]  tout
    );
        
//******************************************************************/
//               参数定义
//******************************************************************/
parameter    Verify_Mode=0;

//******************************************************************/
//               信号定义
//******************************************************************/
reg  [7:0]  d;
wire [31:0] c;

//**********************************************************************/
//            CRC计算
//**********************************************************************/
always @(*)
    if (invert_en==1)
        d = ~din;
    else
        d = din;

assign c = crc32_value;

always @(posedge sclk)
    if(crc_en==1)
        begin
        if(data_en==1)
            begin
            crc32_value[31] <= c[29]^c[23];
            crc32_value[30] <= c[31]^c[28]^c[22];
            crc32_value[29] <= c[31]^c[30]^c[27]^c[21];
            crc32_value[28] <= c[30]^c[29]^c[26]^c[20];
            crc32_value[27] <= c[31]^c[29]^c[28]^c[25]^c[19];
            crc32_value[26] <= c[30]^c[28]^c[27]^c[24]^c[18];
            crc32_value[25] <= c[27]^c[26]^c[17];
            crc32_value[24] <= c[31]^c[26]^c[25]^c[16];
            crc32_value[23] <= c[30]^c[25]^c[24]^c[15];
            crc32_value[22] <= c[24]^c[14];
            crc32_value[21] <= c[29]^c[13];
            crc32_value[20] <= c[28]^c[12];
            crc32_value[19] <= c[31]^c[27]^c[11];
            crc32_value[18] <= c[31]^c[30]^c[26]^c[10];
            crc32_value[17] <= c[30]^c[29]^c[25]^c[9];
            crc32_value[16] <= c[29]^c[28]^c[24]^c[8];
            crc32_value[15] <= c[31]^c[29]^c[28]^c[27]^c[7];
            crc32_value[14] <= c[31]^c[30]^c[28]^c[27]^c[26]^c[6];
            crc32_value[13] <= c[31]^c[30]^c[29]^c[27]^c[26]^c[25]^c[5];
            crc32_value[12] <= c[30]^c[29]^c[28]^c[26]^c[25]^c[24]^c[4];
            crc32_value[11] <= c[28]^c[27]^c[25]^c[24]^c[3];
            crc32_value[10] <= c[29]^c[27]^c[26]^c[24]^c[2];
            crc32_value[9]  <= c[29]^c[28]^c[26]^c[25]^c[1];
            crc32_value[8]  <= c[28]^c[27]^c[25]^c[24]^c[0];
            crc32_value[7]  <= c[31]^c[29]^c[27]^c[26]^c[24]^d[0];
            crc32_value[6]  <= c[31]^c[30]^c[29]^c[28]^c[26]^c[25]^d[1];
            crc32_value[5]  <= c[31]^c[30]^c[29]^c[28]^c[27]^c[25]^c[24]^d[2];
            crc32_value[4]  <= c[30]^c[28]^c[27]^c[26]^c[24]^d[3];
            crc32_value[3]  <= c[31]^c[27]^c[26]^c[25]^d[4];
            crc32_value[2]  <= c[31]^c[30]^c[26]^c[25]^c[24]^d[5];
            crc32_value[1]  <= c[31]^c[30]^c[25]^c[24]^d[6];
            crc32_value[0]  <= c[30]^c[24]^d[7];
            end
        end
    else if (Verify_Mode==0)
        crc32_value <= {crc32_value[23:0],8'h00};
    else
        crc32_value <= 0;

assign tout = 8'd0;

endmodule
